# 用于插入股票信息到数据库中

import pandas as pd
from sqlalchemy import create_engine
import tushare as ts
from sqlalchemy import create_engine, text  # 添加text导入
from datetime import datetime, timedelta

# 创建数据库连接引擎
engine = create_engine('mysql+pymysql://root:@127.0.0.1:3306/stocks?charset=utf8mb4&use_unicode=1')

# 初始化 pro 接口
pro = ts.pro_api('d499c0996f2683e29f260b0e62df6b67e33c234b073d361736e18c87')

# 查询不同的 ts_code
query = "SELECT DISTINCT ts_code FROM stocks_daily"
ts_codes = pd.read_sql(query, con=engine)['ts_code'].tolist()


def insert_or_update_stock_info(ts_code, symbol, name, area, industry, cnspell, market, exchange, st_status, list_date,
                                is_hs, act_name, act_ent_type):
    """
    插入或更新股票信息到 stocks_info 表中
    如果记录存在则更新，不存在则插入

    :param ts_code: 股票TS代码
    :param symbol: 股票代码
    :param name: 股票名称
    :param area: 地域
    :param industry: 所属行业
    :param cnspell: 拼音缩写
    :param market: 市场类型
    :param exchange: 交易所代码
    :param st_status: ST 状态
    :param list_date: 上市日期
    :param is_hs: 是否沪深港通标的，N否 H沪股通 S深股通
    :param act_name: 实际控制人名称
    :param act_ent_type: 实际控制人类型
    """
    # 检查记录是否存在
    check_query = f"SELECT COUNT(*) FROM stocks_info WHERE ts_code = '{ts_code}'"
    exists = pd.read_sql(check_query, con=engine).iloc[0, 0] > 0

    if exists:
        # 更新现有记录
        update_query = f"""
        UPDATE stocks_info 
        SET 
            symbol = '{symbol}',
            name = '{name}',
            area = '{area}',
            industry = '{industry}',
            cnspell = '{cnspell}',
            market = '{market}',
            exchange = '{exchange}',
            st_status = '{st_status}',
            list_date = '{list_date}',
            is_hs = '{is_hs}',
            act_name = '{act_name}',
            act_ent_type = '{act_ent_type}'
        WHERE ts_code = '{ts_code}'
        """
        try:
            with engine.begin() as conn:
                conn.execute(text(update_query))
            print(f"{name}({ts_code}) 股票信息更新成功！")
        except Exception as e:
            print(f"更新 {name}({ts_code}) 股票信息时出现错误: {e}")
    else:
        # 插入新记录
        data = {
            'ts_code': [ts_code],
            'symbol': [symbol],
            'name': [name],
            'area': [area],
            'industry': [industry],
            'cnspell': [cnspell],
            'market': [market],
            'exchange': [exchange],
            'st_status': [st_status],
            'list_date': [list_date],
            'is_hs': [is_hs],
            'act_name': [act_name],
            'act_ent_type': [act_ent_type]
        }
        df = pd.DataFrame(data)
        try:
            df.to_sql('stocks_info', con=engine, if_exists='append', index=False)
            print(f"{name}({ts_code}) 股票信息插入成功！")
        except Exception as e:
            print(f"插入 {name}({ts_code}) 股票信息时出现错误: {e}")

"""
insert_or_update_stock_info(ts_code='000001.SZ',symbol='000001',name='平安银行',area='广东省深圳市',industry='银行',cnspell='PA Bank',market='A股',exchange='SZSE',st_status='N',list_date='1991-04-03',is_hs='H',act_name='深圳市人民政府国有资产监督管理委员会',act_ent_type='地方国资委')
insert_or_update_stock_info(ts_code='000002.SZ',symbol='000002',name='万科A',area='广东省深圳市',industry='房地产',cnspell='Wanke A',market='A股',exchange='SZSE',st_status='N',list_date='1991-01-29',is_hs='H',act_name='深圳市地铁集团有限公司',act_ent_type='地方国有企业')
insert_or_update_stock_info(ts_code='603178.SH',symbol='603178',name='圣龙股份',area='浙江省宁波市',industry='汽车零部件',cnspell='Sheng Long',market='A股',exchange='SHSE',st_status='N',list_date='2017-03-21',is_hs='N',act_name='罗玉龙',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='601933.SH',symbol='601933',name='永辉超市',area='福建省福州市',industry='零售业',cnspell='Yonghui Chaoshi',market='A股',exchange='SHSE',st_status='N',list_date='2010-12-15',is_hs='H',act_name='张轩松、张轩宁',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='601086.SH', symbol='601086', name='国芳集团', area='甘肃省兰州市', industry='零售业',cnspell='Guofang Group', market='A股', exchange='SHSE', st_status='N', list_date='2017-09-01',is_hs='N', act_name='张国芳', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002165.SZ', symbol='002165', name='红宝丽', area='江苏省南京市', industry='化学制品', cnspell='Hongbaoli', market='A股', exchange='SZSE', st_status='N', list_date='2007-09-13', is_hs='N', act_name='芮敬功', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002583.SZ', symbol='002583', name='海能达', area='广东省深圳市', industry='通信设备', cnspell='Hainengda', market='A股', exchange='SZSE', st_status='N', list_date='2011-02-22', is_hs='N', act_name='陈清州', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002131.SZ', symbol='002131', name='利欧股份', area='浙江省台州市', industry='通用设备', cnspell='Liougufen', market='A股', exchange='SZSE', st_status='N', list_date='2007-04-27', is_hs='N', act_name='王相荣', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='000617.SZ', symbol='000617', name='中油资本', area='北京市西城区', industry='多元金融', cnspell='Zhongyouziben', market='A股', exchange='SZSE', st_status='N', list_date='1996-10-22', is_hs='N', act_name='中国石油天然气集团有限公司', act_ent_type='国有法人')
insert_or_update_stock_info(ts_code='002251.SZ', symbol='002251', name='步步高', area='湖南省湘潭市', industry='零售', cnspell='Bubugao', market='A股', exchange='SZSE', st_status='N', list_date='2008-06-19', is_hs='N', act_name='王填', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002427.SZ', symbol='002427', name='尤夫股份', area='浙江省湖州市', industry='化学纤维', cnspell='Youfugufen', market='A股', exchange='SZSE', st_status='N', list_date='2010-06-08', is_hs='N', act_name='翁中华', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002261.SZ', symbol='002261', name='拓维信息', area='湖南省长沙市', industry='软件开发', cnspell='Tuoweixinxi', market='A股', exchange='SZSE', st_status='N', list_date='2008-07-23', is_hs='N', act_name='李新宇', act_ent_type='自然人')
insert_or_update_stock_info(ts_code='600505.SH',symbol='600505',name='西昌电力',area='四川省凉山彝族自治州',industry='电力',cnspell='Xichangdianli',market='A股',exchange='SSE',st_status='N',list_date='2002-05-30',is_hs='N',act_name='古强',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='600644.SH',symbol='600644',name='乐山电力',area='四川省乐山市',industry='电力',cnspell='Leshandianli',market='A股',exchange='SSE',st_status='N',list_date='1993-04-26',is_hs='N',act_name='林双庆',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002194.SZ',symbol='002194',name='武汉凡谷',area='湖北省武汉市',industry='通信设备',cnspell='Wuhanfangu',market='A股',exchange='SZSE',st_status='N',list_date='2007-08-21',is_hs='N',act_name='孟庆南',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002354.SZ',symbol='002354',name='天娱数科',area='辽宁省大连市',industry='文化传媒',cnspell='Tianyushuke',market='A股',exchange='SZSE',st_status='N',list_date='2010-06-01',is_hs='N',act_name='朱晔',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='600186.SH',symbol='600186',name='莲花控股',area='河南省项城市',industry='食品加工制造',cnspell='LianhuaKongGu',market='A股',exchange='SSE',st_status='N',list_date='1998-08-25',is_hs='N',act_name='夏建统',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='000565.SZ',symbol='000565',name='渝三峡A',area='重庆市万州区',industry='化学制品',cnspell='YuSanXiaA',market='A股',exchange='SZSE',st_status='N',list_date='1994-04-08',is_hs='N',act_name='重庆市能源投资集团有限公司',act_ent_type='国有法人')
insert_or_update_stock_info(ts_code='002190.SZ',symbol='002190',name='成飞集成',area='四川省成都市',industry='汽车零部件',cnspell='ChengFeiJiCheng',market='A股',exchange='SZSE',st_status='N',list_date='2007-12-03',is_hs='N',act_name='成都飞机工业（集团）有限责任公司',act_ent_type='国有法人')
insert_or_update_stock_info(ts_code='600610.SH',symbol='600610',name='中毅达',area='上海市',industry='化学原料',cnspell='ZhongYiDa',market='A股',exchange='SSE',st_status='N',list_date='1992-03-26',is_hs='N',act_name='中国信达资产管理股份有限公司',act_ent_type='国有法人')
insert_or_update_stock_info(ts_code='002510.SZ',symbol='002510',name='天汽模',area='天津市',industry='汽车零部件',cnspell='TianQiMo',market='A股',exchange='SZSE',st_status='N',list_date='2010-11-15',is_hs='N',act_name='天津渤海轻工投资集团有限公司',act_ent_type='国有法人')
insert_or_update_stock_info(ts_code='002471.SZ',symbol='002471',name='中超控股',area='江苏省宜兴市',industry='电网设备',cnspell='Chao Zhong',market='A股',exchange='SZSE',st_status='N',list_date='2010-09-10',is_hs='N',act_name='黄锦光',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='002882.SZ',symbol='002882',name='金龙羽',area='广东省深圳市',industry='电网设备',cnspell='Jin Long Yu',market='A股',exchange='SZSE',st_status='N',list_date='2017-07-17',is_hs='N',act_name='郑永汉',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='601288.SH',symbol='601288',name='农业银行',area='北京市',industry='银行',cnspell='NongYeYinHang',market='A 股 ',exchange='SSE',st_status='N',list_date='2010-07-15',is_hs='Y',act_name=' 财政部 ',act_ent_type=' 国有法人 ')
insert_or_update_stock_info (ts_code='000676.SZ',symbol='000676',name=' 智度股份 ',area=' 广东省 ',industry='文化传媒',cnspell='ZhiDuGuFen',market='A 股 ',exchange='SZSE',st_status='N',list_date='1997-01-21',is_hs='N',act_name='陆宏达',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='600789.SH',symbol='600789',name='鲁抗医药',area='山东省',industry='化学制药',cnspell='LuKangYiYao',market='A 股 ',exchange='SSE',st_status='N',list_date='1997-02-26',is_hs='N',act_name='山东鲁抗医药集团有限公司',act_ent_type='国有企业')
insert_or_update_stock_info (ts_code='002402.SZ',symbol='002402',name='和而泰',area='广东省',industry='白色家电',cnspell='HeErTai',market='A 股 ',exchange='SZSE',st_status='N',list_date='2010-05-20',is_hs='N',act_name='刘建伟',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='002475.SZ',symbol='002475',name='立讯精密',area='广东省',industry='消费电子',cnspell='LiXunJingMi',market='A 股 ',exchange='SZSE',st_status='N',list_date='2010-09-15',is_hs='Y',act_name='王来胜',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='603618.SH',symbol='603618',name='杭电股份',area='浙江省',industry='电网设备',cnspell='HangDianGuFen',market='A 股 ',exchange='SSE',st_status='N',list_date='2015-02-17',is_hs='N',act_name='汪力成',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='000680.SZ',symbol='000680',name='山推股份',area='山东省',industry='工程机械',cnspell='ShanTuiGuFen',market='A 股 ',exchange='SZSE',st_status='N',list_date='1997-01-22',is_hs='N',act_name='山东重工集团有限公司',act_ent_type='国有法人')
insert_or_update_stock_info (ts_code='002040.SZ',symbol='002040',name='南京港',area='江苏省',industry='港口航运',cnspell='NanJingGang',market='A 股 ',exchange='SZSE',st_status='N',list_date='2005-03-25',is_hs='N',act_name='南京港（集团）有限公司',act_ent_type='国有法人')
insert_or_update_stock_info (ts_code='600025.SH',symbol='600025',name='华能水电',area='云南省',industry='电力',cnspell='HuaNengShuiDian',market='A 股 ',exchange='SSE',st_status='N',list_date='2020-09-29',is_hs='Y',act_name='中国华能集团有限公司',act_ent_type='国有法人')
insert_or_update_stock_info (ts_code='601985.SH',symbol='601985',name='中国核电',area='北京市',industry='电力',cnspell='ZhongGuoHeDian',market='A 股 ',exchange='SSE',st_status='N',list_date='2015-06-01',is_hs='Y',act_name='中国核工业集团有限公司',act_ent_type='国有法人')
insert_or_update_stock_info (ts_code='000672.SZ',symbol='000672',name='上峰水泥',area='甘肃省',industry='建筑材料',cnspell='ShangFengShuiNi',market='A 股 ',exchange='SZSE',st_status='N',list_date='1996-11-08',is_hs='N',act_name='俞锋',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='000981.SZ',symbol='000981',name='山子高科',area='宁夏回族自治区',industry='汽车零部件',cnspell='ShanZiGaoKe',market='A 股 ',exchange='SZSE',st_status='N',list_date='2000-06-22',is_hs='N',act_name='叶骥',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='002475.SZ',symbol='002475',name='立讯精密',area='广东省',industry='消费电子',cnspell='LiXunJingMi',market='A 股 ',exchange='SZSE',st_status='N',list_date='2010-09-15',is_hs='Y',act_name='王来春',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='605255.SH',symbol='605255',name='天普股份',area='浙江省',industry='汽车零部件',cnspell='TianPuGuFen',market='A 股 ',exchange='SSE',st_status='N',list_date='2020-12-28',is_hs='N',act_name='尤晓卫',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='002549.SZ',symbol='002549',name='凯美特气',area='湖南省',industry='化环境治理',cnspell='KaiMeiTeQi',market='A 股 ',exchange='SZSE',st_status='N',list_date='2011-02-18',is_hs='N',act_name='祝恩福',act_ent_type='自然人')
insert_or_update_stock_info (ts_code='003021.SZ',symbol='003021',name='兆威机电',area='广东省',industry='电机',cnspell='ZhaoWeiJiDian',market='A 股 ',exchange='SZSE',st_status='N',list_date='2020-12-04',is_hs='N',act_name='李海周',act_ent_type='自然人')
insert_or_update_stock_info(ts_code='600895.SH', symbol='600895', name='张江高科', area='上海市', industry='房地产', cnspell='ZhangJiangGaoKe', market='A 股', exchange='SSE', st_status='N', list_date='1996-04-03', is_hs='N', act_name='刘樱', act_ent_type='自然人')
insert_or_update_stock_info (ts_code='002156.SZ',symbol='002156',name=' 通富微电 ',area=' 安徽省 ',industry=' 半导体 ',cnspell='TongFuWeiDian',market='A 股 ',exchange='SZSE',st_status='N',list_date='2007-08-01',is_hs='N',act_name=' 徐东 ',act_ent_type=' 自然人 ')
insert_or_update_stock_info (ts_code='002371.SZ',symbol='002371',name=' 北方华创 ',area=' 北京市 ',industry=' 半导体 ',cnspell='BeiFangHuaChuang',market='A 股 ',exchange='SZSE',st_status='N',list_date='2010-03-12',is_hs='N',act_name=' 张劲松 ',act_ent_type=' 自然人 ')
insert_or_update_stock_info (ts_code='601360.SH',symbol='601360',name=' 三六零 ',area=' 北京市 ',industry='软件开发',cnspell='SanLiuLing',market='A 股 ',exchange='SSE',st_status='N',list_date='2011-03-03',is_hs='N',act_name=' 周鸿祎 ',act_ent_type=' 自然人 ')
insert_or_update_stock_info (ts_code='000592.SZ',symbol='000592',name=' 平潭发展 ',area=' 福建省 ',industry='种植业与林业',cnspell='PingTanFaZhan',market='A 股 ',exchange='SZSE',st_status='N',list_date='1996-03-27',is_hs='N',act_name=' 刘平山 ',act_ent_type=' 自然人 ')
insert_or_update_stock_info (ts_code='603686.SH',symbol='603686',name=' 福龙马 ',area=' 福建省 ',industry='环境治理',cnspell='FuLongMa',market='A 股 ',exchange='SSE',st_status='N',list_date='2015-12-23',is_hs='N',act_name=' 张桂丰 ',act_ent_type=' 自然人 ')
"""